package com.example.autopia.view.Activities

import android.app.Activity
import android.app.Dialog
import android.content.Intent
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import android.view.Gravity
import android.view.View
import android.view.ViewGroup
import android.view.Window
import android.widget.EditText
import android.widget.ImageButton
import android.widget.TextView
import android.widget.Toast
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
import com.example.autopia.R
import com.example.autopia.databinding.ActivityEditProfileBinding
import com.example.autopia.model.Item.Car
import com.example.autopia.model.Item.User
import com.example.autopia.model.Repositories.UsersRepository
import com.example.autopia.utilities.ImageManager
import com.example.autopia.utilities.PreferenceManager
import com.google.firebase.auth.EmailAuthProvider
import com.google.firebase.auth.ktx.auth
import com.google.firebase.ktx.Firebase

class EditProfileActivity : AppCompatActivity() {
    private lateinit var binding: ActivityEditProfileBinding
    private lateinit var userPreference: PreferenceManager
    private val imageManager = ImageManager()
    private val PICK_IMAGE_REQUEST = 1
    private var photo: String? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityEditProfileBinding.inflate(layoutInflater)
        setContentView(binding.root)

        userPreference = PreferenceManager(this@EditProfileActivity)
        binding.apply {
            btBack.setOnClickListener {
                finish()
            }
            btChangePassword.setOnClickListener {
                showDialog()
            }
            rivLogo.setOnClickListener {
                addPhoto()
            }
            etEmail.setText(userPreference.getString("userEmail"))
            etName.setText(userPreference.getString("userName"))
            if (userPreference.getString("userPhoto") != null && userPreference.getString("userPhoto") != "null")
            {
                rivLogo.setImageBitmap(imageManager.byteArrayToBitmap(userPreference.getString("userPhoto")!!))
            }
        }
    }

    private fun showDialog() {
        val dialog = Dialog(this@EditProfileActivity)
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
        dialog.setContentView(R.layout.dialog_edit_password)

        val etOldPass = dialog.findViewById<EditText>(R.id.etOldPass)
        val etNewPass = dialog.findViewById<TextView>(R.id.etNewPass)
        val etNewRepPass = dialog.findViewById<EditText>(R.id.etNewRepPass)
        val btSave = dialog.findViewById<ImageButton>(R.id.btToSave)
        val btClose = dialog.findViewById<ImageButton>(R.id.btClose)

        btSave.setOnClickListener {
            val userOldPassword = etOldPass.text.toString()
            val userNewPass = etNewPass.text.toString()
            val userNewRepPass = etNewRepPass.text.toString()

            val auth = Firebase.auth
            val user = auth.currentUser

            if (userOldPassword.isEmpty() && userNewPass.isEmpty() && userNewRepPass.isEmpty()) {
                // Не заполнены поля
                Toast.makeText(
                    this,
                    "Необходимо заполнить все поля",
                    Toast.LENGTH_SHORT
                ).show()
            } else if (userNewPass.length < 6) {
                Toast.makeText(
                    this,
                    "Слишком короткий новый пароль",
                    Toast.LENGTH_SHORT
                ).show()
            } else if (!userNewPass.equals(userNewRepPass)) {
                // Пароли не совпадают
                Toast.makeText(
                    this,
                    "Пароли не совпадают",
                    Toast.LENGTH_SHORT
                ).show()
            } else {
                val credential = EmailAuthProvider.getCredential(user?.email ?: "", userOldPassword)
                user?.reauthenticate(credential)
                    ?.addOnSuccessListener {
                        // Пароль подтвержден, можно обновить пароль
                        user.updatePassword(userNewPass)
                            .addOnSuccessListener {
                                // Пароль успешно обновлен
                                Toast.makeText(
                                    this,
                                    "Пароль успешно изменен",
                                    Toast.LENGTH_SHORT
                                ).show()
                            }
                            .addOnFailureListener { exception ->
                                // Произошла ошибка при обновлении пароля
                                Toast.makeText(
                                    this,
                                    "Произошла ошибка при обновлении пароля",
                                    Toast.LENGTH_SHORT
                                ).show()
                            }
                        dialog.dismiss();
                    }
                    ?.addOnFailureListener { exception ->
                        // Произошла ошибка при подтверждении старого пароля
                        Toast.makeText(
                            this,
                            "Неверный старый пароль",
                            Toast.LENGTH_SHORT
                        ).show()
                    }
            }
        }
        btClose.setOnClickListener {
            dialog.dismiss()
        }
        dialog.show()
        dialog.window?.setLayout(
            ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.WRAP_CONTENT
        )
        dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
        dialog.window?.attributes!!.windowAnimations = R.style.DialogAnimation
        dialog.window?.setGravity(Gravity.BOTTOM)
    }

    fun addPhoto() {
        // Вызываем интент для выбора изображения из галереи
        val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
        startActivityForResult(intent, PICK_IMAGE_REQUEST)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        if (requestCode == PICK_IMAGE_REQUEST && resultCode == Activity.RESULT_OK) {
            if (data != null) {
                val imageUri = data.data
                photo = imageUri?.let { imageManager.imageToByteArray(it, contentResolver) }
                if (photo != null) {
                    binding.rivLogo.setImageBitmap(imageManager.byteArrayToBitmap(photo!!))
                    UsersRepository().changePhoto(Firebase.auth.currentUser!!.uid, photo!!)
                    userPreference.putString("userPhoto", photo!!)
                } else {
                    Toast.makeText(
                        this@EditProfileActivity,
                        "Размер фотографии превышает 2мб",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }
        }
    }
}